/*
 * NodoInterno.cpp
 */

#include "NodoInterno.h"

NodoInterno::NodoInterno() {
}

NodoInterno::~NodoInterno() {
}

int NodoInterno::guardarEnBloque(int tamBloque) {

	this->bloque = Bloque(tamBloque);
	int res = 0;

	Registro registro(Util::intToCharAst(numeroDeNodo));
	res = this->bloque.agregarRegistro(registro);
	if (res == -1) {
		return res;
	}

	registro.buffer = (Util::intToCharAst(nivel));
	res = this->bloque.agregarRegistro(registro);
	if (res == -1) {
		return res;
	}

	registro.buffer = (Util::intToCharAst(elementos.size()));
	res = this->bloque.agregarRegistro(registro);
	if (res == -1) {
		return res;
	}

	registro.buffer = (Util::intToCharAst(hijoIzq));
	res = this->bloque.agregarRegistro(registro);
	if (res == -1) {
		return res;
	}

	for (int i = 0; i < elementos.size(); i++) {
		registro.buffer = (Util::intToCharAst(elementos.at(i).clave));
		res = this->bloque.agregarRegistro(registro);
		if (res == -1) {
			return res;
		}
		registro.buffer = (Util::intToCharAst(elementos.at(i).hijoDer));
		res = this->bloque.agregarRegistro(registro);
		if (res == -1) {
			return res;
		}
	}
	return 0;
}

int NodoInterno::leerDeBloque(Bloque elBloque) {
	//Si el nivel no es > 0 entonces no es un nodo interno y devuelve -1;
	Registro * registro = elBloque.obtenerRegistro(2);
	int nivel = Util::stringToInt(registro->buffer);
	if (nivel > 0) {
		this->nivel = nivel;

		registro = elBloque.obtenerRegistro(1);
		int nroNodo = Util::stringToInt(registro->buffer);
		this->numeroDeNodo = nroNodo;

		registro = elBloque.obtenerRegistro(3);
		int cantElementos = Util::stringToInt(registro->buffer);
		this->cantidadDeElementos = cantElementos;

		registro = elBloque.obtenerRegistro(4);
		int nodoIzq = Util::stringToInt(registro->buffer);
		this->hijoIzq = nodoIzq;

		this->elementos.clear();
		ElementoInterno elemento;
		for (int i = 5; i < (this->cantidadDeElementos * 2) + 5; i++) {
			registro = elBloque.obtenerRegistro(i);
			int clave = Util::stringToInt(registro->buffer);
			i++;
			registro = elBloque.obtenerRegistro(i);
			int nodoDer = Util::stringToInt(registro->buffer);
			elemento.clave = clave;
			elemento.hijoDer = nodoDer;
			this->elementos.push_back(elemento);
		}

	} else {
		return -1;
	}

}

bool NodoInterno::tieneClave(int clave) {
	bool resultado = false;

	for (int i = 0; i < elementos.size(); i++) {
		if (elementos.at(i).clave == clave) {
			return true;
		}
	}
	return resultado;
}
